/**
 *  外部中断驱动  配置按键对应的GPIO为中断模式
 */
#include "bsp_exit.h"  //主要包含中断初始化,中断处理函数
#include "bsp_gpio.h" 
#include "bsp_int.h"
#include "bsp_delay.h"
#include "bsp_beep.h"

/**
 *  @brief GPIO1_IO18最终的中断处理函数   GPIO1_IO16 ~ GPIO1_IO31这些中断都用这个函数
 *  @param  无
 *  @retval 无 
 */
void gpio1_io18_irqhandler(void)
{
    static uint8_t state=0;

    /**
     *  采用延时消抖,中断服务函数中禁止使用延时函数! 因为中断服务需要
     *  快进快出!! 这里是为了延时   
     */
    delay(10);   //这里是延时10ms

    if(gpio_pinread(GPIO1,18)==0)
    {   //下降沿中断
        state= !state;
        beep_switch(state);
    }
    gpio_clearintflags(GPIO1,18);   //清除中断标志  中断发生完成之后一定得清除中断标志为位
}

// typedef struct 
// {
//     gpio_pin_direction_t direction;         /*gpio方向*/
//     uint8_t outputLogic;                    /*输出电平 */
//     gpio_interrupt_mode_t interruptMode;    /*中断方式*/
// }gpio_pin_config_t;

/**
 *  @brief 初始化外部中断
 *  @param 无
 *  @retval 无
 */
void exit_init(void)
{
    gpio_pin_config_t key_config;

    /*1.设置IO复用  GPIO也是复用功能中的一种*/
    IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18,0);  //将输出关闭就是输入吗???  对了还得设置方向       设置复用为什么功能
    IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18,0xF080);  //22K电阻上拉 拉   100MHz  输出失能    再来对复用的功能进行设置

    /*2.初始化GPIO为中断模式    设置输出的方向  和中断的方式*/
    key_config.direction=kGPIO_DigitalInput;
    key_config.interruptMode=kGPIO_IntFallingEdge;  //下降沿中断
    key_config.outputLogic=1;
    gpio_init(GPIO1,18,&key_config);  //但还没有开启中断

    /*3.使能GIC中断,注册中断服务函数,使能GPIO中断*/
    GIC_EnableIRQ(GPIO1_Combined_16_31_IRQn); //这里类是于  NVIC中的中断      使能GPIO_IO18所对应的中断总开关
                                              //这里是将gpio1_io18_irqhandler转换成 system_irq_handler_t类型的指针
    system_register_irqhandler(GPIO1_Combined_16_31_IRQn,(system_irq_handler_t)gpio1_io18_irqhandler,NULL);  //用户参数为NULL
    //上面主要是给 /*中断服务函数表*/  初始化 赋值

    gpio_enableint(GPIO1,18);                 //这里表示具体的中断
}